/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.AnalisadorSintatico;


import compilador.AnalisadorLexico.Atomo;
import compilador.AnalisadorSemantico.GeracaoDeCodigo.TiposAS;

/**
 *
 * @author Leles
 */
public class SM_Comandos extends SubMaquina {

    private enum Estados {
        CMD_INICIAL, 
        IN_ESPERA_ID, OUT_ESPERA_ID, INOUT_ESPERA_PONTOVIRGULA,
        INSTRUCAO_VAZIA,
        ACEITA
    };
    
    SM_Comandos() {
        estadoInicial = Estados.CMD_INICIAL.ordinal();
        estadoFinal = Estados.ACEITA.ordinal();
        
        defineTabelaTransicao();
        
    }
    
    
    private void defineTabelaTransicao (){
        /* Tabela com as Transicao
         * A maior parte das posicoes de memoria sao vazias
         * Funciona assim:  o primeiro indice indica o ESTADO ATUAL
         *                  o segundo  indice indica o ATOMO LIDO
         * Transicao DE SUBMAQUINA:
         * também passam um estado, o estado da volta
         * Ele é chamado na funcao, depois do retorno da submaquina
         * assim não é necessaria uma pilha explicita
         */
        
        numEstados = Estados.class.getEnumConstants().length;
        numAtomos = Atomo.TokenType.class.getEnumConstants().length;
        
        Tabela_Decisao = new Transicao [numEstados][numAtomos];
        
        // Transicao SUB MAQUINA COMANDOS
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.IF.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.CMD_INICIAL.ordinal(), 
                                SM_CMD_If.class,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.SWITCH.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.CMD_INICIAL.ordinal(), 
                                SM_CMD_Switch.class,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.WHILE.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.CMD_INICIAL.ordinal(), 
                                SM_CMD_While.class,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.DO.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.CMD_INICIAL.ordinal(), 
                                SM_CMD_DoWhile.class,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.FOR.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.SubMaquina, 
                                Estados.CMD_INICIAL.ordinal(), 
                                SM_CMD_For.class,
                                TiposAS.ACAO_NENHUMA);
        
        
        
        
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.INPUT.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.IN_ESPERA_ID.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()][Atomo.TokenType.OUT.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.OUT_ESPERA_ID.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.IN_ESPERA_ID.ordinal()]
                [Atomo.TokenType.ID.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.INOUT_ESPERA_PONTOVIRGULA.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.OUT_ESPERA_ID.ordinal()]
                [Atomo.TokenType.ID.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.INOUT_ESPERA_PONTOVIRGULA.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        Tabela_Decisao 
                [Estados.INOUT_ESPERA_PONTOVIRGULA.ordinal()]
                [Atomo.TokenType.PONTOEVIRGULA.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.CMD_INICIAL.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        
        
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()]
                [Atomo.TokenType.PONTOEVIRGULA.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.CMD_INICIAL.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        /*Tabela_Decisao 
        [Estados.INSTRUCAO_VAZIA.ordinal()]
        [Atomo.TokenType.TRANSICAO_VAZIA.ordinal()] = 
        new Transicao(  Transicao.TipoTransicao.Estado, 
        Estados.CMD_INICIAL.ordinal(), 
        null);*/
        
        
        
        
        Tabela_Decisao 
                [Estados.CMD_INICIAL.ordinal()]
                [Atomo.TokenType.TRANSICAO_VAZIA.ordinal()] = 
                new Transicao(  Transicao.TipoTransicao.Estado, 
                                Estados.ACEITA.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA);
        
    }        

    
    
}
